/*
 * CargoParser.cpp
 *
 *  Created on: Oct 9, 2011
 *      Author: lore
 */

#include "CargoParser.h"


CargoParser::CargoParser() {
}
CargoParser::~CargoParser() {
}

vector<Cargo> CargoParser::parse(string filePath, unsigned long* registrosOk, unsigned long* registrosFail){

	vector<Cargo> cargosParseados;

	(*registrosOk)=0;
	(*registrosFail)=0;

	fstream _file;

	_file.open(filePath.c_str(),ios::in|ios::out);

	/* cada linea del archivo va a ser de la forma
	 * 1|nombre cargo ppal.|cargo2, cargo3,cargo4...
	 *
	 */

	if (!_file.is_open()){
	}
	else {
			string aLine;
			/*
			 *Leo linea por linea el archivo
			 */
			while (getline(_file, aLine)){

				unsigned long id = -1;
				string nombre;
				vector<string> idcargosaux;
				unsigned long idcargos;

				// limpio "aLine
				StringUtils su;
				aLine = su.replaceAllOccurences(aLine,"\r"," ");
				aLine = su.replaceAllOccurences(aLine,"\n"," ");
				su.trim(aLine);

				if (aLine.length() == 0) {
					continue;
				}

				size_t separator = aLine.find_first_of('|', 0);
				if (separator== string::npos){
					(*registrosFail)++;
					continue;
				}

				string idText = aLine.substr(0,separator);
				id = strtoul(idText.c_str(),NULL,0);
				
				size_t separator2 = aLine.find_first_of('|', separator+1);
				nombre = aLine.substr(separator + 1,separator2-separator-1);
				
				if (id <= 0) {
					(*registrosFail)++;
					continue;
				}

				if (separator2 == string::npos) {
						(*registrosFail)++;
						continue;
				}
				
				/* Leo el vector de id cargos separados por ','
				 * lo paso a un vector auxiliar
				 */

				string idcargostext = aLine.substr(separator2 + 1);

				idcargosaux = su.split(idcargostext,',');

				/*
				 * Creo el objeto Cargo
				 */
							
				Cargo cargo;
				cargo.setCargoId(id);
				cargo.setCargo(nombre);
				
				/* Para cada posicion del vector auxiliar lo convierte
				 * en un unsigned long
				 */
				for(int i=0; i< idcargosaux.size();i++){
				  idcargos = strtoul(idcargosaux.at(i).c_str(),NULL,0);
				  cargo.addCargos(idcargos);
				  }
				cargosParseados.push_back(cargo);
				(*registrosOk)++;
			}
	}
	return cargosParseados;
}
